Paquetería necesaria para el análisis

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.2     ✓ purrr   0.3.4
## ✓ tibble  3.0.4     ✓ dplyr   1.0.4
## ✓ tidyr   1.1.2     ✓ stringr 1.4.0
## ✓ readr   1.4.0     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(ggrepel)
library(reshape2)
## 
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths
library(heatmaply)
## Loading required package: plotly
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
## Loading required package: viridis
## Loading required package: viridisLite
## 
## ======================
## Welcome to heatmaply version 1.2.1
## 
## Type citation('heatmaply') for how to cite the package.
## Type ?heatmaply for the main documentation.
## 
## The github page is: https://github.com/talgalili/heatmaply/
## Please submit your suggestions and bug-reports at: https://github.com/talgalili/heatmaply/issues
## Or contact: <tal.galili@gmail.com>
## ======================
theme_set(ggthemes::theme_fivethirtyeight())

Datos

vgsales <- read_csv("/Users/DavidRojas/Documents/GitHub/proyecto-videojuegos/data/vgsales.csv")
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   Rank = col_double(),
##   Name = col_character(),
##   Platform = col_character(),
##   Year = col_character(),
##   Genre = col_character(),
##   Publisher = col_character(),
##   NA_Sales = col_double(),
##   EU_Sales = col_double(),
##   JP_Sales = col_double(),
##   Other_Sales = col_double(),
##   Global_Sales = col_double()
## )

Analisis Exploratorio de Datos

vgsales %>% 
  skimr::skim_without_charts()
Data summary
Name Piped data
Number of rows 16598
Number of columns 11
_______________________
Column type frequency:
character 5
numeric 6
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Name 0 1 1 132 0 11493 0
Platform 0 1 2 4 0 31 0
Year 0 1 3 4 0 40 0
Genre 0 1 4 12 0 12 0
Publisher 0 1 3 38 0 579 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100
Rank 0 1 8300.61 4791.85 1.00 4151.25 8300.50 12449.75 16600.00
NA_Sales 0 1 0.26 0.82 0.00 0.00 0.08 0.24 41.49
EU_Sales 0 1 0.15 0.51 0.00 0.00 0.02 0.11 29.02
JP_Sales 0 1 0.08 0.31 0.00 0.00 0.00 0.04 10.22
Other_Sales 0 1 0.05 0.19 0.00 0.00 0.01 0.04 10.57
Global_Sales 0 1 0.54 1.56 0.01 0.06 0.17 0.47 82.74

Con base en el resumen de nuestro conjunto de datos:

Se encontraron 5 variables categoricas: - Name: El título del videojuego - Genre: El genero al que pertenece dicho titulo - Plataform: Para que plataforma fué publicado el título - Publisher: Compañía que publica el juego - Developer: Desarolladora del juego

Así mismo se observan 6 variables numericas: - Rank: El rango con base en el total de ventas correspondiente a cada videojuego - Goblal_Sales: Ventas globales del título - NA_sales , EU_Sales, JP_Sales, Other_Sales : Ventas del videojuego por región

Es importante resaltar que aparentemente, el conjunto de datos parece estar relativamente limpio y completo ya que para todas las variables existe un ratio de completitud de 1.

En este resumen tambien se pueden observar estadísticos, medidas de posición y tendencia para cada una de las variables numericas, asi como el numero de niveles para las categoricas.

Limpieza de datos

vgsales <- vgsales %>% 
  filter(Year != "N/A")

Visualización de datos

Titulos publicados por año

  vgsales %>%
    mutate(Year = ymd(str_c(Year,"-01-01")) ) %>% 
    ggplot(aes(x = Year))+
    geom_bar(fill = "darkslategray", color = "white")+
    scale_x_date(breaks = "3 years", 
                 date_labels = "%Y",
                 limits = ymd(c("1980-01-01","2020-01-01")))+
    theme(axis.text.x = element_text(angle = 45))+
    ggtitle("Conteo de titulos publicados por año")
## Warning: Removed 2 rows containing missing values (geom_bar).

Se observa una tendencia creceinte en desarrollo de vieojuegos desde 1982, tomando un máximo entre 2005 y 2007, para decrecer desde ese punto hasta la actualidad. Lo anterior puede ser causado por la consolidación del mercado, es decir se producen menos cantidades porque la industria de desarolladores ya esta mas establecida.

Veamos una gráfica de los mejores desarolladores desde 2006 a 2017

vgsales %>% 
  group_by(Year,Publisher) %>% 
  filter(Year > 2005 && Year <2018) %>% 
  summarise(total_sales = sum(Global_Sales)) %>% 
  top_n(5) %>% 
  ggplot(aes(x = Publisher, y = total_sales, fill = Year))+
  geom_bar(stat = "identity")+
  facet_wrap(~Year,scales = "free_x")+
  coord_flip()+
  theme(legend.position = "none")+
  ggtitle("Mejores desarolladores por año desde 2005")
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
## Selecting by total_sales

Como se puede observar a pesar que desde 2005 la cantidad de títulos producidos es menor, la mayoría de las ventas se encuentran en compañías consolidadas de la industria

Ahora, es de interés ver el comportamiento global de ventas por región y genero de los juegos desde 2006 hasta la actualidad.

vgsales %>% 
  group_by(Year,Genre) %>% 
  filter(Year>2005 && Year<2018) %>% 
  summarise(total_sales = sum(Global_Sales)) %>% 
  top_n(3) %>% 
  ggplot(aes(x = Genre, y = total_sales , fill = Year))+
  geom_bar(stat = "identity")+
  facet_wrap(~Year,scales = "free_x")+
  coord_flip()+
  theme(legend.position = "none")+
  ggtitle("Generos con mas ventas por año desde 2005",subtitle = "A nivel global")
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
## Selecting by total_sales

vgsales %>% 
  group_by(Year,Genre) %>% 
  filter(Year>2005 && Year<2018) %>% 
  summarise(total_sales = sum(EU_Sales)) %>% 
  top_n(3) %>% 
  ggplot(aes(x = Genre, y = total_sales , fill = Year))+
  geom_bar(stat = "identity")+
  facet_wrap(~Year,scales = "free_x")+
  coord_flip()+
  theme(legend.position = "none")+
  ggtitle("Generos con mas ventas por año desde 2005",subtitle = "En Estados Unidos")
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
## Selecting by total_sales

vgsales %>% 
  group_by(Year,Genre) %>% 
  filter(Year>2005 && Year<2018) %>% 
  summarise(total_sales = sum(JP_Sales)) %>% 
  top_n(3) %>% 
  ggplot(aes(x = Genre, y = total_sales , fill = Year))+
  geom_bar(stat = "identity")+
  facet_wrap(~Year,scales = "free_x")+
  coord_flip()+
  theme(legend.position = "none")+
  ggtitle("Generos con mas ventas por año desde 2005",subtitle = "En Japón")
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
## Selecting by total_sales

vgsales %>% 
  group_by(Year,Genre) %>% 
  filter(Year>2005 && Year<2018) %>% 
  summarise(total_sales = sum(NA_Sales)) %>% 
  top_n(3) %>% 
  ggplot(aes(x = Genre, y = total_sales , fill = Year))+
  geom_bar(stat = "identity")+
  facet_wrap(~Year,scales = "free_x")+
  coord_flip()+
  theme(legend.position = "none")+
  ggtitle("Generos con mas ventas por año desde 2005",subtitle = "En NA")
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
## Selecting by total_sales

Con lo anterior se puede observar que existen preferencias por ciertos generos de acuerdo a la región, la región de Estados Unidos prefiere los generos de Deportes, Shooters y Acción mientras que la región de Japón predomina el genero de juegos de rol para todos los años.

Como tendencia general a lo largo de los años para todas las regiones los juegos más preferidos son: Deportes, Shooters, Juegos de rol, Miscelaneos y Acción.

Modelo

Como se observo para cada una de las regiones asi como para los años, el generó provó ser una característica significativa, ya que marca las tendecias de las ventas,pero, todavía falta comprobarlo estadísticamente.

Ahora seleccionaremos uno de los generos que se consideraron predominantes en todo el conjunto de datos para realizar un análisis de ventas, la intención es ajustar un modelo lineal que describa el comportamiento de ventas para cada genero.

Nuestra hipótesis es la siguiente: - H0: El genero y el año no son predictores significativos para las ventas de los videojuegos - H1: El genero y el año son predicores significativos para las ventas de los videojuegos

vgsales_genre <- vgsales %>% 
  filter(Genre %in% c("Sports","Shooter","Role-Playing","Misc","Action"), 
         Year > 2007) %>% 
  select(Year,Global_Sales,Genre) %>% 
  na.omit() %>% 
  group_by(Year,Genre) %>% 
  summarise(total_sales = sum(Global_Sales))
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
vgsales_genre %>% 
  ggplot(aes(x = ymd(str_c(Year,"-01-01")), y = total_sales, color = Genre))+
  geom_point()+
  geom_path()+
  geom_smooth()+
  facet_wrap(~Genre)+
  theme(axis.text.x = element_text(angle = 45), legend.position = "none")+
  ggtitle("Comportamiento del mercado por generos relevantes")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

vgsales_genre <- vgsales_genre %>% 
  mutate(Year = as.numeric(Year))

lm(total_sales ~ Genre+ poly(Year,4) ,data = vgsales_genre) # El tercer y cuarto termino del polinomio no es estadisticamente significativo, se eliminan
## 
## Call:
## lm(formula = total_sales ~ Genre + poly(Year, 4), data = vgsales_genre)
## 
## Coefficients:
##       (Intercept)          GenreMisc  GenreRole-Playing       GenreShooter  
##             99.77             -58.69             -53.58             -37.56  
##       GenreSports     poly(Year, 4)1     poly(Year, 4)2     poly(Year, 4)3  
##            -41.28            -182.81             -54.39             -15.36  
##    poly(Year, 4)4  
##            -32.21
model <- lm(total_sales ~ Genre+ poly(Year,2) ,data = vgsales_genre)

summary(model)
## 
## Call:
## lm(formula = total_sales ~ Genre + poly(Year, 2), data = vgsales_genre)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -38.967 -10.216   0.099  12.567  51.641 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         98.798      6.397  15.445  < 2e-16 ***
## GenreMisc          -56.998      9.307  -6.124 3.16e-07 ***
## GenreRole-Playing  -53.580      9.017  -5.942 5.70e-07 ***
## GenreShooter       -35.867      9.307  -3.854 0.000412 ***
## GenreSports        -39.594      9.307  -4.254 0.000123 ***
## poly(Year, 2)1    -182.291     20.248  -9.003 3.65e-11 ***
## poly(Year, 2)2     -53.717     20.304  -2.646 0.011599 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 20.16 on 40 degrees of freedom
## Multiple R-squared:  0.767,  Adjusted R-squared:  0.7321 
## F-statistic: 21.95 on 6 and 40 DF,  p-value: 3.111e-11
pred <-tibble(Year = c(2018,2019,2018,2019,2018,2019,2018,2019,2018,2019),
       Genre = c("Sports","Sports","Action","Action","Misc","Misc","Role-Playing","Role-Playing",
                 "Shooter","Shooter"))

predict(model,pred) 
##         1         2         3         4         5         6         7         8 
## -27.44045 -51.87853  12.15351 -12.28457 -44.84489 -69.28297 -41.42649 -65.86457 
##         9        10 
## -23.71378 -48.15186

Como se puede observar el modelo polinomio de segundo grado fué el que mejor desempeño estadístico tuvo. Se rechaza la hipótesis nula con base en las pruebas t individuales de los regresores y el estadístico F con un p-val menor a 0.05. Es decir, el genero del videojuego y el año son predictores significativos para las ventas.

Sin embargo los valores predecidos para los siguientes años no hacen mucho sentido, debido a que la estructura en general de las ventas presenta una tendencia decreciente desde el año 2006, lo cual es extraño. Es decir, el modelo no es malo, pero, habría que verificar la fiabilidad de los datos comparandolos con otros indicadores de la industria, dado que una tendencia decreciente por mucho tiempo en una industria sólida no hace mucho sentido, y por tanto este fue el mayor problema de la investigación.

Correlación de las ventas por región y globales

regresion<- vgsales %>%
  select(Global_Sales,EU_Sales,JP_Sales,NA_Sales,Other_Sales) 
regresion<-na.omit(regresion)

heatmaply_cor(
  cor(regresion),
  k_col = 2, 
  k_row = 2
)

Haremos un diagrama de barras para ver las ventas que han tenido en cada región y nos daremos cuenta que efectivamente, las ventas del género de Acción son las que predominan en las regiones a excepción de la región de Japón, que tienen mas preferencia al género Role-Playing

vgsales %>%
    gather("Region", "Value", c("NA_Sales", "EU_Sales", "JP_Sales", "Other_Sales")) %>%
    group_by(Region, Genre) %>%
    summarize(Sales = sum(Value)) %>%
    top_n(n = 3) %>%
    ggplot(aes(x = Region, y = Sales, group = Region, fill = Genre)) +
    geom_col(position = "stack") +
    scale_fill_viridis(discrete = TRUE) +
    labs(title = "Top Género por región")
## `summarise()` has grouped output by 'Region'. You can override using the `.groups` argument.
## Selecting by Sales

Ahora, tambien nos interesa ver el comportamiento de las compañias de desarrollo de videojuegos que ha tenido mayor auge a lo largo del tiempo, usaremos un modelo de serie de tiempo para visualizarlo.

toppub <- vgsales %>%
    filter(Publisher %in% c("Electronic Arts", "Activision", "Ubisoft", "Namco Bandai Games", "Nintendo")) %>%
    group_by(Publisher, Year) %>%
    summarize(total = sum(Global_Sales))
## `summarise()` has grouped output by 'Publisher'. You can override using the `.groups` argument.
vgsales %>%
    group_by(Publisher, Year) %>%
    summarize(total = sum(Global_Sales)) %>%
    ggplot(aes(x = Year, y = total)) +
    geom_point(data = toppub, aes(col = Publisher), size = 3.0) +
    geom_line(data = toppub, aes(Year,total,group=Publisher,colour=Publisher), size = 1.3) +
    geom_path(data = toppub, aes(col = Publisher), size = 1.3)+
    scale_color_viridis(discrete = TRUE) +
    labs(title = "Serie de tiempo pde ventas por compañia", y = "Ventas en millones")+
    theme(axis.text.x = element_text(angle = 90))
## `summarise()` has grouped output by 'Publisher'. You can override using the `.groups` argument.
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?

Por último, nos interesa ver en general las consolas que han sido vendidas y las ventas que han generado para ver que efectivamente Nintendo es el que ha tenido mayor densidad en los últimos años.

vgsales %>%
    group_by(Platform, Year) %>%
    summarize(total = sum(Global_Sales, na.rm = TRUE)) %>%
    ggplot(aes(x = Year, y = total, fill = Platform)) +
    geom_col(position = "stack") +
    labs(y = "Ventas ", title = "Ventas globales por consola") +
    scale_fill_viridis(discrete = TRUE)
## `summarise()` has grouped output by 'Platform'. You can override using the `.groups` argument.